﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using TinyPMS_Jerusalem.Models.DBModel;
using System.Web.Mvc;

namespace TinyPMS_Jerusalem.Models.Interface
{
    interface IPropertyReposity:IRepository<Property>
    {
        /// <summary>
        /// 借出指定的物品
        /// </summary>
        /// <param name="instance">指定的物品的实例，可通过GetElementById获取</param>
        /// <param name="userName">进行借出操作的用户的用户名</param>
        void Borrow(Property instance,string userName);

        /// <summary>
        /// 归还指定的物品
        /// </summary>
        /// <param name="instance">指定的物品的实例，可通过GetElementById获取</param>
        /// <param name="userName">进行归还操作的用户的用户名</param>
        void Return(Property instance,string userName);

        /// <summary>
        /// 续借指定的物品，执行此方法前因先判断物品能否续借  Todo:写一个方法判断物品能否续借
        /// </summary>
        /// <param name="instance">指定的物品的实例，可通过GetElementById获取</param>
        /// <param name="userName">进行续借操作的用户的用户名</param>
        void Renew(Property instance,string userName);

        /// <summary>
        /// 根据关键字搜索对应的物品，并返回满足条件的物品的集合
        /// 关键字用空格分隔
        /// 搜索的属性有ID、Name、Introduction、Category和Tags
        /// </summary>
        /// <param name="keywords">搜索的关键字</param>
        /// <returns>满足条件的Property实例的集合</returns>
        List<Property> Search(string keywords);
    }

    interface IPropertyDetail
    {
        /// <summary>
        /// 通过存储在数据库中的DetailType，自动判断并返回对应的Detail对象，如BookDetail
        /// 
        /// IMPORTANT:使用此方法前必须先判断物品是否存在，即传入的propertyID对应的物品必须是存在的
        /// </summary>
        /// <param name="propertyID">给定的物品ID值</param>
        /// <returns>对应物品的Detail对象，返回null表示没有找到对应物品的详细信息</returns>
        object GetDetail(string propertyID);
    }

    interface IPropertyAdminRepository:IRepository<Property>
    {
        /// <summary>
        /// 审核通过用户的借出申请
        /// 这是一个管理员才能调用的方法
        /// </summary>
        /// <param name="instance">对应的借出申请的记录的实例</param>
        /// <param name="adminName">进行审核操作的管理员的用户名</param>
        void ApproveBorrowApply(BorrowLog instance,string adminName);
        void CreateViewDataForDropLists(out List<SelectListItem> categoryListViewData, out List<SelectListItem> availableListViewData);
    }
}